在程序调试以及运行过程中 Log 都是分析程序运行的重要部分。本文记录了python
的logging
库的使用方法。
前言
logging
提供了方便的日志输出接口,可以指定将日志输出到控制台或者保存到文件,并提供了5种不同的输出日志输出等级:DEBUG
<INFO
<WARNING
<ERROR
<CRITICAL
,可以为不同的输出方式(文件、控制台)等指定不同的输出等级,只有大于等于输出等级的日志才会被显示出来。
Logging
中包含了4个重要的对象
Logger
log操作的主要对象Handler
日志保存到地方(可以是控制台或者一个文件),一个logger
可以包括多个Handler
Filter
过滤日志的方法Formatter
指定日志输出的格式,可以为每个Handler
单独指定不同的Formatter
常见使用方法
python
import sys, logger
# 获取一个logger对象,可以指定logger 的名字,这个名字可以用来区分不同的logger输出
logger = logging.Logger('AmazeballsLogger')
# 设置log控制台的输出,指定为sys.stdout,默认值是sys.stderr
sh = logging.StreamHandler(sys.stdout)
# 添加控制台输出Handler到Logger
logger.addHandler(sh)
# 设置log输出到一个文件
fh = logging.FileHandler("/path/to/file.log", 'w+')
# 添加文件输出Handler到Logger
logger.addHandler(sh)
# 指定全局输出的格式
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
logger.handler.setFormatter(formatter)
Logger
初始化完毕后就可以使用logger
提供的接口输出日志信息了,具体的使用方法为:
python
logger.critical("critical")
logger.error("error")
logger.warning("warning")
logger.info("info")
logger.debug("debug")
指定输出等级
当我们有一些信息只想保存在log文件但是不想显示在控制台中时,可以设置不同输出Handler
的Level
属性达到目的。
python
# 先设置全局的输出等级为最低,否则默认全局的最低输出等级是 WARNING,后面的设置都不会生效
logger.setLevel(logging.DEBUG)
# 设置控制台的日志输出等级,只有大于 WARNING 等级的日志会被输出到控制台
sh.setLevel(logging.WARNING)
logger.addHandler(sh)
# 设置文件的日志输出等级,只有大于 DEBUG 等级的日志会被保存到文件
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
设置完成后执行
python
logger.critical("critical")
logger.error("error")
logger.warning("warning")
logger.info("info")
logger.debug("debug")
控制台输出
shell
2020-04-13 17:52:57,729 - CRITICAL - critical
2020-04-13 17:52:57,731 - ERROR - error
2020-04-13 17:52:57,734 - WARNING - warning
文件输出
shell
2020-04-13 17:52:57,729 - CRITICAL - critical
2020-04-13 17:52:57,731 - ERROR - error
2020-04-13 17:52:57,734 - WARNING - warning
2020-04-13 17:52:57,734 - INFO - info
2020-04-13 17:52:57,734 - DEBUG - debug
设置输出格式
可以使用不同的占位符设置log的显示日志
python
# %(asctime)s 输出时间,String
# %(filename)s 输出日志的源文件文件名,String
# %(lineno)d 输出日志的源文件所在文件的行数, Decimal
# %(levelname)s 输出等级, String
# %(message)s" 输出信息内容 String
# 可以使用
formatter = logging.Formatter("[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s")
logger.handler.setFormatter(formatter)
# 单独指定不同 Handler 的输出格式
fh.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))